/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


 /**
 *@file TablaHuffmanLC.cpp
 *@brief Implementaciones de las funciones del módulo TablaHuffmanLC
 *@author Mary Carmen Suarez
 *
 */

#include <iostream>
#include <cassert>
#include <TablaHuffmanLC.h>

using namespace std;

TablaHuffmanLC :: TablaHuffmanLC()
{
	int bit = 8;
	int sig = 0;
	for (int i=0; i<288; i++)
	{
		simbolo[i] = i;
		if (i<144)
		{
			nbits[i]=bit;
			codificacion[i]=VectorBits(48+sig,bit);
			codificacion[i].Invertir();
		}
		else
		{
			if (i==144) sig=0;
			if (i<256)
			{
				nbits[i]=bit+1;
				codificacion[i]=VectorBits(400+sig,bit+1);
				codificacion[i].Invertir();
			}
			else
			{
				if (i==256) sig=0;
				if (i<280)
				{
					nbits[i]=bit-1;
					codificacion[i]=VectorBits(sig,bit-1);
					codificacion[i].Invertir();
				}				
				else
				{
					if (i==280) sig=0;
					nbits[i]=bit;
					codificacion[i]=VectorBits(192+sig,bit);
					codificacion[i].Invertir();
				}
			}
		}
		sig++;
	}
}

TablaHuffmanLC :: ~TablaHuffmanLC()
{ }

void TablaHuffmanLC :: Escribir()const
{
	for (int i=0; i<288; i++)
		cout <<simbolo[i]<<"---"<<nbits[i]<<"-----"<<codificacion[i]<<endl;	
}

const VectorBits& TablaHuffmanLC :: GetCodificacion (int d) const
{
	assert(d>=0 && d<288);
	return codificacion[d];
}

bool TablaHuffmanLC :: EstaCodificacion (const VectorBits & v)
{
	for (int i=0; i<288; i++)
		if( v == codificacion[i] )
			return true;
	return false;
}

int TablaHuffmanLC :: GetSimbolo (const VectorBits & v)
{
	for (int i=0; i<288; i++)
		if ( v == codificacion[i] )
			return simbolo[i];
	return 0; //Aqui nunca llega
}
